package string;

/**
 * 如果一个字符串不含有任何重复字符，我们称这个字符串为 好 字符串。
 * 给你一个字符串 s ，请你返回 s 中长度为 3 的 好子字符串 的数量。
 * 注意，如果相同的好子字符串出现多次，每一次都应该被记入答案之中。
 * 子字符串 是一个字符串中连续的字符序列。
 * <p>
 * 示例 1：
 * 输入：s = "xyzzaz"
 * 输出：1
 * 解释：总共有 4 个长度为 3 的子字符串："xyz"，"yzz"，"zza" 和 "zaz" 。
 * 唯一的长度为 3 的好子字符串是 "xyz" 。
 * <p>
 * 示例 2：
 * 输入：s = "aababcabc"
 * 输出：4
 * 解释：总共有 7 个长度为 3 的子字符串："aab"，"aba"，"bab"，"abc"，"bca"，"cab" 和 "abc" 。
 * 好子字符串包括 "abc"，"bca"，"cab" 和 "abc" 。
 *
 * @author Jisheng Huang
 * @version 20250514
 */
public class CountGoodSubstr_1876 {
    /**
     * Loop through the string
     * 通过位运算判断
     *
     * @param s the given string
     * @return
     */
    public static int countGoodSubstrings(String s) {
        if (s.length() < 3) {
            return 0;
        }

        int count = 0;
        char[] chs = s.toCharArray();

        for (int i = 0; i < chs.length - 2; ++i) {
            int a = (int) chs[i];
            int b = (int) chs[i + 1];
            int c = (int) chs[i + 2];

            int d = a ^ b ^ c;

            if (d != a && d != b && d != c) {
                ++count;
            } else {
                // Skip if the second and third characters are the same
                if (b == c) {
                    ++i;
                }
            }
        }

        return count;
    }

    public static void main(String[] args) {
        String s = "xyzzaz";
        System.out.println(countGoodSubstrings(s));

        s = "aababcabc";
        System.out.println(countGoodSubstrings(s));
    }
}